//--------头文件----------//
#include "Driver_Time.h"
//========================================================
// Function: Driver_Time1Init(void)
// Description: 定时器1初始化：ch1、ch4 输出pwm
// Input：	无
// Output:  无
// Return:  无
// Others: 
//========================================================
void Driver_Time1Init(void)
{
    //时钟，gpio， 基本定时器， 配置pwm模式， 启动定时器计数
    //TB6612的PWM管脚PA8默认复用功能TIM1_CH1，PA11默认复用功能TIM1_CH4
    
    //1 开时钟
    //1.1 开启定时器4的时钟
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
    //1.2 开启GPIO的时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN| RCC_APB2ENR_AFIOEN;
    
    //2. 开GPIO
    //2.1 设置GPIO为复用推挽输出 PA8 CNF = 10 复用功能推挽输出 MODE = 11, 输出模式，最大速度50MHz  //
    //最终要设置的值为1011,0x000b
    GPIOA->CRH |= GPIO_CRH_CNF8_1;      /* 1000 */ 
    GPIOA->CRH |= GPIO_CRH_MODE8;     /* 0011 */

    //2.2 设置GPIO为复用推挽输出 PA11 CNF = 10 复用功能推挽输出 MODE = 11, 输出模式，最大速度50MHz  //
    //最终要设置的值为1011,0x000b
    GPIOA->CRH |= GPIO_CRH_CNF11_1;      /* 1000 */ 
    GPIOA->CRH |= GPIO_CRH_MODE11;     /* 0011 */

    //3 通用定时器基本配置
    //pwm输出频率 = 72M时钟频率/(分频*重载值) = 10k
    //3.1 预分频器的配置
    TIM1->PSC = 1 - 1;
    //3.2 自动重装载
    TIME1->ARR = 7200 - 1;
    //3.3 CR1寄存器的第4位：计数器计数方向 ：0 = 向上  1 = 向下
    TIME1->CR1 &= ~TIM_CR1_DIR; //向上计数
    //3.4 计数器的值        
    TIM1->CNT = 0;

    //4 配置TIM1的通道1为PWM模式
    //4.1 配置TIM1-CH1 的捕获比较寄存器
    TIM1->CCR1 = 0;
    //4.2 把通道1配置为输出  第0-1位为00 CCMR1_CC1S = 00
    TIM1->CCMR1 &= ~TIM_CCMR1_CC1S;     //将最后两位清零操作
    //4.3 配置TIM1通道1的输出比较模式为：PWM模式1，位6:4 CCMR1_OC1M = 110
    TIM1->CCMR1 |= TIM_CCMR1_OC1M_2;
    TIM1->CCMR1 |= TIM_CCMR1_OC1M_1;
    TIM1->CCMR1 &= ~TIM_CCMR1_OC1M_0;
    //4.4 配置使能通道1 位1 为1
    TIM1->CCER |= TIM_CCER_CC1E;
    //4.5 配置通道的极性 位1 为0 0=高电平有效 1=低电平有效
    TIM1->CCER &= ~TIM_CCER_CC1P;
    

    //5 配置TIM1的通道4为PWM模式
    //5.1 配置TIM1-CH4 的捕获比较寄存器
    TIM1->CCR4 = 0;
    //5.2 把通道1配置为输出  第0-1位为00 CCMR1_CC1S = 00
    TIM1->CCMR2 &= ~TIM_CCMR2_CC4S;     //将最后两位清零操作
    //5.3 配置TIM1通道1的输出比较模式为：PWM模式1，位6:4 CCMR1_OC1M = 110
    TIM1->CCMR2 |= TIM_CCMR2_OC4M_2;
    TIM1->CCMR2 |= TIM_CCMR2_OC4M_1;
    TIM1->CCMR2 &= ~TIM_CCMR2_OC4M_0;
    //5.4 配置使能通道1 位1 为1
    TIM1->CCER |= TIM_CCER_CC4E;
    //5.5 配置通道的极性 位1 为0 0=高电平有效 1=低电平有效
    TIM1->CCER &= ~TIM_CCER_CC4P;
    
    //6 启动定时器 定时器的控制寄存器 位0 为1
    TIM1->CR1 |= TIM_CR1_CEN;
}

//========================================================
// Function: Driver_Time2Init(void)
// Description: 定时器2初始化：ch1、ch2 编码器模式  
// Input：	无
// Output:  无
// Return:  无
// Others:  A电机编码器测速 PA0 PA1
//========================================================
void Driver_Time2Init(void)
{
    //时钟，gpio， 基本定时器， 配置编码器模式
    //A电机的编码器测试管脚PA0默认复用功能TIM2_CH1，PA1默认复用功能TIM2_CH2
    
    //1 开时钟
    //1.1 开启定时器2的时钟
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    //1.2 开启GPIO的时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
    
    //2. 开GPIO
    //2.1 设置GPIO为复用推挽输出 PA0 CNF = 10 复用功能推挽输出 MODE = 11, 输出模式，最大速度50MHz  //
    //最终要设置的值为1011,0x000b
    GPIOA->CRL |= GPIO_CRL_CNF0_1;      /* 1000 */ 
    GPIOA->CRL |= GPIO_CRL_MODE0;       /* 0011 */ 

    //2.2 设置GPIO为复用推挽输出 PA1 CNF = 10 复用功能推挽输出 MODE = 11, 输出模式，最大速度50MHz  //
    //最终要设置的值为1011,0x000b
    GPIOA->CRL |= GPIO_CRL_CNF1_1;      /* 1000 */ 
    GPIOA->CRL |= GPIO_CRL_MODE1;     /* 0011 */

    //3 通用定时器基本配置
    //pwm输出频率 = 72M时钟频率/(分频*重载值) = 10k
    //3.1 预分频器的配置
    TIM2->PSC = 1 - 1;
    //3.2 自动重装载
    TIME2->ARR = 7200 - 1;
    //3.3 CR1寄存器的第4位：计数器计数方向 ：0 = 向上  1 = 向下
    TIME2->CR1 &= ~TIM_CR1_DIR; //向上计数
    //3.4 计数器的值        
    TIM2->CNT = 0;

    //4 配置TIM2的通道2为编码器模式
    //4.1 配置输入通道映射: 位1:0  IC1-TI1,  CC1S=01，
    TIM2->CCMR1 |= TIM_CCMR1_CC1S_0;    //置位0为1;
    TIM2->CCMR1 &= ~TIM_CCMR1_CC1S_1;   //确保位1为0;
    //位9:8 IC2-TI2, CC2S=01
    TIM2->CCMR1 |= TIM_CCMR1_CC2S_0;    //置位0为1；
    TIM2->CCMR1 &= ~TIM_CCMR1_CC2S_1;   //确保位1为0；
    //4.2 配置不反相 CC1P=0， CC2P=0 */
    TIM2->CCER &= ~TIM_CCER_CC1P;
    TIM2->CCER &= ~TIM_CCER_CC2P;
    //4.3 两路信号都计数, 编码器模式3, SMS = 011 位2:0
    TIM2->SMCR &= ~TIM_SMCR_SMS_2;
    TIM2->SMCR |= TIM_SMCR_SMS_1;
    TIM2->SMCR |= TIM_SMCR_SMS_0;

    //5. 启动定时器
    TIM2->CR1 |= TIM_CR1_CEN; 
}

//========================================================
// Function: Driver_Time4Init(void)
// Description: 定时器4初始化：ch1、ch2 编码器模式  
// Input：	无
// Output:  无
// Return:  无
// Others:  B电机编码器测速 PB6 PB7
//========================================================
void Driver_Time4Init(void)
{
    //时钟，gpio， 基本定时器， 配置编码器模式
    //A电机的编码器测试管脚PB6默认复用功能TIM4_CH1，PB7默认复用功能TIM4_CH2
    
    //1 开时钟
    //1.1 开启定时器4的时钟
    RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
    //1.2 开启GPIO的时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
    
    //2. 开GPIO
    //2.1 设置GPIO为复用推挽输出 PB6 CNF = 10 复用功能推挽输出 MODE = 11, 输出模式，最大速度50MHz  //
    //最终要设置的值为1011,0x000b
    GPIOB->CRL |= GPIO_CRL_CNF6_1;      /* 1000 */ 
    GPIOB->CRL |= GPIO_CRL_MODE6;       /* 0011 */ 

    //2.2 设置GPIO为复用推挽输出 PB7 CNF = 10 复用功能推挽输出 MODE = 11, 输出模式，最大速度50MHz  //
    //最终要设置的值为1011,0x000b
    GPIOB->CRL |= GPIO_CRL_CNF7_1;      /* 1000 */ 
    GPIOB->CRL |= GPIO_CRL_MODE7;     /* 0011 */

    //3 通用定时器基本配置
    //pwm输出频率 = 72M时钟频率/(分频*重载值) = 10k
    //3.1 预分频器的配置
    TIM4->PSC = 1 - 1;
    //3.2 自动重装载
    TIME4->ARR = 7200 - 1;
    //3.3 CR1寄存器的第4位：计数器计数方向 ：0 = 向上  1 = 向下
    TIME4->CR1 &= ~TIM_CR1_DIR; //向上计数
    //3.4 计数器的值        
    TIM4->CNT = 0;

    //4 配置TIM4的通道2为编码器模式
    //4.1 配置输入通道映射: 位1:0  IC1-TI1,  CC1S=01，
    TIM4->CCMR1 |= TIM_CCMR1_CC1S_0;    //置位0为1;
    TIM4->CCMR1 &= ~TIM_CCMR1_CC1S_1;   //确保位1为0;
    //位9:8 IC2-TI2, CC2S=01
    TIM4->CCMR1 |= TIM_CCMR1_CC2S_0;    //置位0为1；
    TIM4->CCMR1 &= ~TIM_CCMR1_CC2S_1;   //确保位1为0；
    //4.2 配置不反相 CC1P=0， CC2P=0 */
    TIM4->CCER &= ~TIM_CCER_CC1P;
    TIM4->CCER &= ~TIM_CCER_CC2P;
    //4.3 两路信号都计数, 编码器模式3, SMS = 011 位2:0
    TIM4->SMCR &= ~TIM_SMCR_SMS_2;
    TIM4->SMCR |= TIM_SMCR_SMS_1;
    TIM4->SMCR |= TIM_SMCR_SMS_0;

    //5. 启动定时器
    TIM4->CR1 |= TIM_CR1_CEN; 
}